﻿// xdatabase.cpp 
// 课程地址 http://cpp.show
// 讲师:夏曹俊
// 抖音 B站 搜索 xiacaojun
// 微信 cppxcj 标注下来源,比如是某某平台学员



#include <iostream>
#include <string>
#include <vector>
#include <cctype>
using namespace std;

//1 学完后面代码后,用面向对象封装,并考虑支持多线程处理任务
//2 支持用map存放数据 
//3 支持创建表格 每个表达里面还是存放key value,存放方式可以设置为线性表vector还是树结构的map
//4 支持持久化,数据缓存入文件 
// 
//写作业流程
// 一 完全自己独立完成
// 二 查找资料完成
// 三 询问老师或者同学不理解的细节
// 四 看老师提供的作业代码
// 五 看老师的讲解视频
// 六 扩展优化作业内容,再与老师同学交流

int main(int argc,char *argv[])
{
	bool is_exit = false;

	//存放关键字
	vector<string> keys;
	vector<string> datas;
	while (!is_exit)
	{
		//提示用户输入
		cout << "xdb>>" << flush;
		string cmd;
		//接收用户输入的一行命令
		getline(cin,cmd);

		//分割好的命令
		vector<string> paras;

		//这里自己实现分割空格,也可以用内部函数
		string tmp;
		for (auto& c : cmd)
		{
			if (c == ' ' || c == '\r' || c == '\t' || c == '\n') //去掉空格和table键
			{
				if (!tmp.empty())
				{
					paras.push_back(tmp);
					tmp = "";
				}
				continue;
			}
			else
			{
				tmp += c;
			}
		}
		if(!tmp.empty())
			paras.push_back(tmp);
		if (paras.empty())continue;

		//insert 关键字 值
		string type = paras[0];
		
		//支持大小写混用
		//大小写转换可以用函数toupper,这里写循环处理
		for (auto &c : type)
		{
			if (c >= 'A' && c <= 'Z')
				c += 32;
		}
		//cout << type << endl;

		if (type == "exit" || type == "quit")
		{
			is_exit = true;
			break;
		}
		else if (type == "insert")
		{
			if (paras.size() != 3)
			{
				cerr << "请输入正确的key和value" << endl;
				continue;
			}

			//可以用find函数,我们这里遍历
			bool finded{ false };
			const string &key = paras[1];
			string data = paras[2];
			for (int i = 0; i < keys.size();i++)
			{
				if (keys[i] == key)
				{
					datas[i] = move(data);
					finded = true;
					break;
				}
			}
			if (!finded)
			{
				keys.push_back(key);
				datas.push_back(move(data));
			}
			cout << "数据存储成功" << endl;
		}
		else if (type == "delete")
		{
			if (paras.size() != 2)
			{
				cerr << "请输入正确的key" << endl;
				continue;
			}
			const string& key = paras[1];
			bool finded{ false };

			for(int i = 0; i < keys.size(); i++)
			{
				if (keys[i] == key)
				{
					keys.erase(keys.begin()+i);
					datas.erase(datas.begin() + i);
					finded = true;
					cout << "key:" << key << "删除成功!" << endl;
					break;
				}
			}
			if(!finded)
				cout<<"key:"<< key << "数据不存在!" << endl;
		}
		else if (type == "select")
		{
			if (paras.size() != 2)
			{
				cerr << "请输入正确的key" << endl;
				continue;
			}
			const string& key = paras[1];
			bool finded{ false };
			for (int i = 0; i < keys.size();i++)
			{
				if (keys[i] == key)
				{
					cout << datas[i] << endl;
					finded = true;
					break;
				}
			}
			if (!finded)
				cout << "key:" << key << "数据不存在!" << endl;
		}
		else
		{
			cerr << type << " \033[44m 命令不支持 \033[0m"<< endl;
		}
		//cout << cmd;
	}
	return 0;
}
